package mx.ipn.negocios.reportes;

import mx.ipn.negocios.CodigosDeError;
import mx.ipn.negocios.ConexionConPersistencia;
//import mx.ipn.to.FechaHoraTO;
import mx.ipn.to.ReporteTO;
import mx.ipn.to.UsuarioTO;
import mx.ipn.to.EmpleadoTO;
import mx.ipn.to.BitacoraServicioTO;
import mx.ipn.to.FormaPagoTO;
import mx.ipn.to.TipoServicioTO;
import mx.ipn.to.TransferObject;

public class ReportesBO {
	public static ReporteTO[] generarReporte(ReporteTO reporteTO) {
		ReporteTO[] respuestaTO = null;

		if (reporteTO != null) {
			switch (reporteTO.getTipoReporte()) {
			case 0: {
				// reporte por Forma de Pago
				FormaPagoTO[] formasPagoTO = (FormaPagoTO[]) ConexionConPersistencia
						.invocaServicio("encontrarFormasDePago",
								FormaPagoTO[].class);
				if (formasPagoTO != null) {
					if (formasPagoTO[0].getTipoError() == 0) {

						respuestaTO = new ReporteTO[formasPagoTO.length];

						for (int x = 0; x < formasPagoTO.length; x++) {
							ReporteTO auxTO = new ReporteTO();

							reporteTO.setIdReferencia(formasPagoTO[x]
									.getIdFormaPago());

							BitacoraServicioTO bitacoraServicioTO = (BitacoraServicioTO) ConexionConPersistencia
									.invocaServicio(
											"encontrarServiciosPorFormaPago",
											reporteTO, BitacoraServicioTO.class);

							if (bitacoraServicioTO != null) {

								String cadena = new String(formasPagoTO[x]
										.getNombre());
								auxTO.setAtributo(cadena);

								if (bitacoraServicioTO.getTipoError() == 0) {
									auxTO
											.setValor(String
													.valueOf(bitacoraServicioTO
															.getListIdOperacion().length));
								} else {
									auxTO.setValor("0");
								}

								/*
								 * auxTO.setAtributo(cadena); respuestaTO = new
								 * ReporteTO[1]; respuestaTO[0] = new
								 * ReporteTO(); respuestaTO[0]
								 * .setTipoError(TransferObject.ERROR);
								 * respuestaTO[0].setError("noda de nada " +
								 * FechaHoraTO.getFecha(reporteTO
								 * .getFechaInicio()) + " \n" +
								 * FechaHoraTO.getFecha(reporteTO
								 * .getFechaFin()) + "\n" +
								 * FechaHoraTO.getHora(reporteTO
								 * .getHoraInicio()) + "\n" +
								 * FechaHoraTO.getHora(reporteTO .getHoraFin()) +
								 * "\n" + (short) reporteTO.getIdReferencia() +
								 * "\n" + String.valueOf(bitacoraServicioTO
								 * .getListIdOperacion().length) + " \n" +
								 * auxTO.getAtributo() + " \n" +
								 * auxTO.getValor() + " \n" + auxTO.getColor());
								 * 
								 * return respuestaTO;
								 */
								respuestaTO[x] = auxTO;

							} else {
								respuestaTO = null;
								respuestaTO = new ReporteTO[1];
								respuestaTO[0] = new ReporteTO();
								respuestaTO[0]
										.setTipoError(TransferObject.ERROR);
								respuestaTO[0].setError(CodigosDeError.error
										.get(40001));
								return respuestaTO;

							}
						}

					} else {
						respuestaTO = null;
						respuestaTO = new ReporteTO[1];
						respuestaTO[0] = new ReporteTO();
						respuestaTO[0].setTipoError(TransferObject.ERROR);
						respuestaTO[0]
								.setError(CodigosDeError.error.get(40001));
					}

				} else {
					respuestaTO = null;
					respuestaTO = new ReporteTO[1];
					respuestaTO[0] = new ReporteTO();
					respuestaTO[0].setTipoError(TransferObject.ERROR);
					respuestaTO[0].setError(CodigosDeError.error.get(40002));
				}
				break;
			}
			case 1: {
				// reporte por Telefonista
				UsuarioTO[] telefonistasTO = (UsuarioTO[]) ConexionConPersistencia
						.invocaServicio("encontrarUsuariosPorGrupo", (short) 4,
								UsuarioTO[].class);
				if (telefonistasTO != null) {
					if (telefonistasTO[0].getTipoError() == 0) {

						respuestaTO = new ReporteTO[telefonistasTO.length];

						for (int x = 0; x < telefonistasTO.length; x++) {
							ReporteTO auxTO = new ReporteTO();

							reporteTO.setIdReferencia(telefonistasTO[x]
									.getIdUsuario());
							EmpleadoTO empleadoTO = (EmpleadoTO) ConexionConPersistencia
									.invocaServicio("encontrarEmpleadoPorID",
											telefonistasTO[x].getIdEmpleado(),
											EmpleadoTO.class);
							if (empleadoTO != null) {
								if (empleadoTO.getTipoError() == 0) {
									auxTO.setAtributo(empleadoTO.getPersonaTO()
											.getNombre()
											+ " "
											+ empleadoTO.getPersonaTO()
													.getApellidoPaterno());
								} else {
									auxTO.setAtributo("empleado: " + x);
								}

							} else {
								respuestaTO = null;
								respuestaTO = new ReporteTO[1];
								respuestaTO[0] = new ReporteTO();
								respuestaTO[0]
										.setTipoError(TransferObject.ERROR);
								respuestaTO[0].setError(CodigosDeError.error
										.get(40001));
								return respuestaTO;
							}

							BitacoraServicioTO bitacoraServicioTO = (BitacoraServicioTO) ConexionConPersistencia
									.invocaServicio(
											"encontrarServiciosPorTelefinista",
											reporteTO, BitacoraServicioTO.class);

							if (bitacoraServicioTO != null) {

								if (bitacoraServicioTO.getTipoError() == 0) {

									auxTO
											.setValor(String
													.valueOf(bitacoraServicioTO
															.getListIdOperacion().length));
								} else {
									auxTO.setValor("0");
								}

								respuestaTO[x] = auxTO;

							} else {
								respuestaTO = null;
								respuestaTO = new ReporteTO[1];
								respuestaTO[0] = new ReporteTO();
								respuestaTO[0]
										.setTipoError(TransferObject.ERROR);
								respuestaTO[0].setError(CodigosDeError.error
										.get(40001));
								return respuestaTO;

							}
						}

					} else {
						respuestaTO = null;
						respuestaTO = new ReporteTO[1];
						respuestaTO[0] = new ReporteTO();
						respuestaTO[0].setTipoError(TransferObject.ERROR);
						respuestaTO[0]
								.setError(CodigosDeError.error.get(40001));
					}

				} else {
					respuestaTO = null;
					respuestaTO = new ReporteTO[1];
					respuestaTO[0] = new ReporteTO();
					respuestaTO[0].setTipoError(TransferObject.ERROR);
					respuestaTO[0].setError(CodigosDeError.error.get(40002));
				}
				break;
			}
			case 2: {
				// reporte por Operadora
				UsuarioTO[] operadorasTO = (UsuarioTO[]) ConexionConPersistencia
						.invocaServicio("encontrarUsuariosPorGrupo", (short) 3,
								UsuarioTO[].class);
				if (operadorasTO != null) {
					if (operadorasTO[0].getTipoError() == 0) {

						respuestaTO = new ReporteTO[operadorasTO.length];

						for (int x = 0; x < operadorasTO.length; x++) {
							ReporteTO auxTO = new ReporteTO();

							reporteTO.setIdReferencia(operadorasTO[x]
									.getIdUsuario());
							EmpleadoTO empleadoTO = (EmpleadoTO) ConexionConPersistencia
									.invocaServicio("encontrarEmpleadoPorID",
											operadorasTO[x].getIdEmpleado(),
											EmpleadoTO.class);
							if (empleadoTO != null) {
								if (empleadoTO.getTipoError() == 0) {
									auxTO.setAtributo(empleadoTO.getPersonaTO()
											.getNombre()
											+ " "
											+ empleadoTO.getPersonaTO()
													.getApellidoPaterno());
								} else {
									auxTO.setAtributo("empleado: " + x);
								}

							} else {
								respuestaTO = null;
								respuestaTO = new ReporteTO[1];
								respuestaTO[0] = new ReporteTO();
								respuestaTO[0]
										.setTipoError(TransferObject.ERROR);
								respuestaTO[0].setError(CodigosDeError.error
										.get(40001));
								return respuestaTO;
							}

							BitacoraServicioTO bitacoraServicioTO = (BitacoraServicioTO) ConexionConPersistencia
									.invocaServicio(
											"encontrarServiciosPorOperadora",
											reporteTO, BitacoraServicioTO.class);

							if (bitacoraServicioTO != null) {

								if (bitacoraServicioTO.getTipoError() == 0) {

									auxTO
											.setValor(String
													.valueOf(bitacoraServicioTO
															.getListIdOperacion().length));
								} else {
									auxTO.setValor("0");
								}

								respuestaTO[x] = auxTO;

							} else {
								respuestaTO = null;
								respuestaTO = new ReporteTO[1];
								respuestaTO[0] = new ReporteTO();
								respuestaTO[0]
										.setTipoError(TransferObject.ERROR);
								respuestaTO[0].setError(CodigosDeError.error
										.get(40001));
								return respuestaTO;

							}
						}

					} else {
						respuestaTO = null;
						respuestaTO = new ReporteTO[1];
						respuestaTO[0] = new ReporteTO();
						respuestaTO[0].setTipoError(TransferObject.ERROR);
						respuestaTO[0]
								.setError(CodigosDeError.error.get(40001));
					}

				} else {
					respuestaTO = null;
					respuestaTO = new ReporteTO[1];
					respuestaTO[0] = new ReporteTO();
					respuestaTO[0].setTipoError(TransferObject.ERROR);
					respuestaTO[0].setError(CodigosDeError.error.get(40002));
				}
				break;
			}
			case 3: {
				// tipo de Servicio
				TipoServicioTO[] tiposServicioTO = (TipoServicioTO[]) ConexionConPersistencia
						.invocaServicio("encontrarTiposServicio",
								TipoServicioTO[].class);
				if (tiposServicioTO != null) {
					if (tiposServicioTO[0].getTipoError() == 0) {

						respuestaTO = new ReporteTO[tiposServicioTO.length];

						int numeroUnidades = -1;

						numeroUnidades = (Integer) ConexionConPersistencia
								.invocaServicio("obtenerNumeroUnidades",
										Integer.class);
						if (numeroUnidades == -1) {
							reporteTO.setUnidadInicio(1);
							reporteTO.setUnidadFin(100);
						} else {
							reporteTO.setUnidadInicio(1);
							reporteTO.setUnidadFin(numeroUnidades);
						}

						for (int x = 0; x < tiposServicioTO.length; x++) {
							ReporteTO auxTO = new ReporteTO();

							reporteTO.setIdReferencia(tiposServicioTO[x]
									.getIdTipoServicio());

							BitacoraServicioTO bitacoraServicioTO = (BitacoraServicioTO) ConexionConPersistencia
									.invocaServicio(
											"encontrarServiciosPorTipoServicio",
											reporteTO, BitacoraServicioTO.class);

							if (bitacoraServicioTO != null) {

								String cadena = new String(tiposServicioTO[x]
										.getCategoriaServicioTO().getNombre()
										+ " "
										+ tiposServicioTO[x]
												.getSubcategoriaServicioTO()
												.getNombre());
								
								auxTO.setAtributo(cadena);

								if (bitacoraServicioTO.getTipoError() == 0) {
									auxTO
											.setValor(String
													.valueOf(bitacoraServicioTO
															.getListIdOperacion().length));
								} else {
									auxTO.setValor("0");
								}

								/*
								 * auxTO.setAtributo(cadena); respuestaTO = new
								 * ReporteTO[1]; respuestaTO[0] = new
								 * ReporteTO(); respuestaTO[0]
								 * .setTipoError(TransferObject.ERROR);
								 * respuestaTO[0].setError("noda de nada " +
								 * FechaHoraTO.getFecha(reporteTO
								 * .getFechaInicio()) + " \n" +
								 * FechaHoraTO.getFecha(reporteTO
								 * .getFechaFin()) + "\n" +
								 * FechaHoraTO.getHora(reporteTO
								 * .getHoraInicio()) + "\n" +
								 * FechaHoraTO.getHora(reporteTO .getHoraFin()) +
								 * "\n" + (short) reporteTO.getIdReferencia() +
								 * "\n" + String.valueOf(bitacoraServicioTO
								 * .getListIdOperacion().length) + " \n" +
								 * auxTO.getAtributo() + " \n" +
								 * auxTO.getValor() + " \n" + auxTO.getColor());
								 * 
								 * return respuestaTO;
								 */
								respuestaTO[x] = auxTO;

							} else {
								respuestaTO = null;
								respuestaTO = new ReporteTO[1];
								respuestaTO[0] = new ReporteTO();
								respuestaTO[0]
										.setTipoError(TransferObject.ERROR);
								respuestaTO[0].setError(CodigosDeError.error
										.get(40001));
								return respuestaTO;

							}
						}

					} else {
						respuestaTO = null;
						respuestaTO = new ReporteTO[1];
						respuestaTO[0] = new ReporteTO();
						respuestaTO[0].setTipoError(TransferObject.ERROR);
						respuestaTO[0]
								.setError(CodigosDeError.error.get(40001));
					}

				} else {
					respuestaTO = null;
					respuestaTO = new ReporteTO[1];
					respuestaTO[0] = new ReporteTO();
					respuestaTO[0].setTipoError(TransferObject.ERROR);
					respuestaTO[0].setError(CodigosDeError.error.get(40002));
				}
				break;
			}
			case 4: {
				// reportes por Rango Unidad
				respuestaTO = new ReporteTO[(reporteTO.getUnidadFin() - reporteTO
						.getUnidadInicio()) + 1];
				int y = 0;
				for (int x = reporteTO.getUnidadInicio(); x <= reporteTO
						.getUnidadFin(); x++) {
					ReporteTO auxTO = new ReporteTO();

					reporteTO.setIdReferencia(x);
					auxTO.setAtributo("Unidad #" + String.valueOf(x));

					BitacoraServicioTO[] bitacoraServicioTO = (BitacoraServicioTO[]) ConexionConPersistencia
							.invocaServicio(
									"encontrarServiciosPorRangoUnidadFechaHora",
									reporteTO, BitacoraServicioTO[].class);

					if (bitacoraServicioTO != null) {

						if (bitacoraServicioTO[0].getTipoError() == 0) {

							auxTO.setValor(String
									.valueOf(bitacoraServicioTO.length));

						} else {
							auxTO.setValor("0");

						}

						respuestaTO[y] = auxTO;
						y++;
					} else {
						respuestaTO = null;
						respuestaTO = new ReporteTO[1];
						respuestaTO[0] = new ReporteTO();
						respuestaTO[0].setTipoError(TransferObject.ERROR);
						respuestaTO[0]
								.setError(CodigosDeError.error.get(40001));
						return respuestaTO;
					}
				}

				break;
			}
			}

		} else {
			respuestaTO = null;
			respuestaTO = new ReporteTO[1];
			respuestaTO[0] = new ReporteTO();
			respuestaTO[0].setTipoError(TransferObject.ERROR);
			respuestaTO[0].setError(CodigosDeError.error.get(40002));
		}

		return respuestaTO;

	}
}
